#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100
typedef int ElemType;
typedef struct {
  ElemType data[MAXSIZE];
  int front;
  int rear;
} Queue;

// 队列的顺序结构 - 循环队列 - 初始化
void initQueue(Queue *Q) {
  Q->front = 0;
  Q->rear = 0;
}

// 队列的顺序结构 - 循环队列 - 判断队列是否为空
int isEmpty(Queue *Q) {
  if (Q->front == Q->rear) {
    printf("空的\n");
    return 1;
  } else {
    return 0;
  }
}

// 队列的顺序结构 - 循环队列 - 出队
ElemType dequeue(Queue *Q) {
  if (Q->front == Q->rear) {
    printf("空的\n");
    return 0;
  }
  ElemType e = Q->data[Q->front];
  Q->front = (Q->front + 1) % MAXSIZE;
  return e;
}

// 队列的顺序结构 - 循环队列 - 入队
int equeue(Queue *Q, ElemType e) {
  if ((Q->rear + 1) % MAXSIZE == Q->front) {
    printf("满了\n");
    return 0;
  }
  Q->data[Q->rear] = e;
  Q->rear = (Q->rear + 1) % MAXSIZE;
  return 1;
}

// 队列的顺序结构 - 循环队列 - 获取队头数据
int getHead(Queue *Q, ElemType *e) {
  if (Q->front == Q->rear) {
    printf("空的\n");
    return 0;
  }
  *e = Q->data[Q->front];
  return 1;
}

int main(int argc, char const *argv[]) {
  Queue q;
  initQueue(&q);
  equeue(&q, 10);
  equeue(&q, 20);
  equeue(&q, 30);
  equeue(&q, 40);
  equeue(&q, 50);

  printf("%d\n", dequeue(&q));
  ElemType *e;
  getHead(&q, &e);
  printf("%d\n", e);

  return 0;
}